{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Writing a general TMM solver\n",
    "Have to solve a full ass matrix equation, but it's only 4x4, so that should be nice.\n",
    "\n",
    "After talking with Beicheng... we know only xz and yz anisotropy works. ANY xy anisotropy FAILS, which we believe to be a fundamental issue with the way the equations are formulated here. The issue with xy anisotropy is that we can no longer assume simultaneously that E and H are simple plane waves.\n",
    "\n",
    "However, one thing should be clear, our eigenvalue sorter still works in this case. More importantly, the case that works is precisely the case that we are trying to solve in our RCWA formalism. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5 0.4999999999999999\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append('../')\n",
    "from TMM_functions import PQ_matrices as pq\n",
    "from TMM_functions import scatter_matrices as sm\n",
    "from TMM_functions import redheffer_star as rs\n",
    "from TMM_functions import generate_initial_conditions as ic\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from numpy.linalg import cond\n",
    "import cmath;\n",
    "from scipy import linalg as LA\n",
    "from numpy.linalg import solve as bslash\n",
    "import time\n",
    "from convolution_matrices.convmat1D import *\n",
    "# from RCWA_1D_functions.grating_fft.grating_conv import *\n",
    "\n",
    "def nonHermitianEigenSorter(eigenvalues):\n",
    "    N = len(eigenvalues);\n",
    "    sorted_indices=[];\n",
    "    sorted_eigs = [];\n",
    "    for i in range(N):\n",
    "        eig = eigenvalues[i];\n",
    "        if(np.real(eig)>0 and np.imag(eig) == 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)==0 and np.imag(eig) > 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)>0 and abs(np.imag(eig)) > 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "    return sorted_eigs, sorted_indices;\n",
    "\n",
    "# Moharam et. al Formulation for stable and efficient implementation for RCWA\n",
    "plt.close(\"all\")\n",
    "'''\n",
    "'''\n",
    "L0 = 1e-6;\n",
    "e0 = 8.854e-12;\n",
    "mu0 = 4*np.pi*1e-8;\n",
    "\n",
    "n_ridge = 3.48;              # ridge\n",
    "n_groove = 3.48;                # groove (unit-less)\n",
    "lattice_constant = 0.7;  # SI units\n",
    "\n",
    "## simulation parameters\n",
    "theta = (45)*np.pi/180;\n",
    "phi = (45)*np.pi/180;\n",
    "e_r = 1;\n",
    "m_r = 1;\n",
    "e_t = 1;\n",
    "m_t = 1;\n",
    "n_i = np.sqrt(e_r);\n",
    "\n",
    "normal_vector= [0,0,-1]\n",
    "\n",
    "# epsilon_tensor = np.array([[12,1,0],[0,2,0],[1,0,12]]);\n",
    "epsilon_tensor = np.array([[1,0,0],[0,1,0],[0,0,1]]);\n",
    "#epsilon_tensor = np.array([[12,5,0],[5,12,0],[0,0,12]]);\n",
    "#epsilon_tensor = np.array([[12,1,0],[0,2,0],[1,0,12]]);\n",
    "\n",
    "#epsilon_tensor = np.array([[12,0,10],[0,12,0],[10,0,12]]);\n",
    "## if the exy eyx term is equal to exx eyy, then there is a degeneracy which you have to account for.\n",
    "#epsilon_tensor = np.array([[12,0,0],[0,12,5],[0,5,12]]);\n",
    "\n",
    "mu_tensor = np.array([[1,0,0],[0,1,0],[0,0,1]])\n",
    "#epsilon_tensor = 12*np.array([[1,0,0],[0,1,0],[0,0,1]])\n",
    "I = np.matrix(np.eye(2))\n",
    "\n",
    "## specify the initial kx and ky\n",
    "k0=1\n",
    "kx = k0 *np.sin(theta)*np.cos(phi);\n",
    "ky = k0 *np.sin(theta)*np.sin(phi);\n",
    "print(kx, ky)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 0.]\n",
      " [0. 1.]] <class 'numpy.matrix'>\n"
     ]
    }
   ],
   "source": [
    "## =================  specify gap media ========================##\n",
    "e_h = 1; m_h = 1;\n",
    "Pg, Qg, kzg = pq.P_Q_kz(kx, ky, e_h, m_h)\n",
    "Wg = I;  # Wg should be the eigenmodes of the E field, which paparently is the identity, yes for a homogeneous medium\n",
    "sqrt_lambda = cmath.sqrt(-1) * Wg;\n",
    "# remember Vg is really Qg*(Omg)^-1; Vg is the eigenmodes of the H fields\n",
    "Vg = Qg * Wg * (sqrt_lambda) ** -1;\n",
    "print(Wg, type(Vg))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Note on PTE and PTM variables\n",
    "I'm looking into this on the basis that isolated polarizations should not even feel an anisotropic dielectric tensor.\n",
    "According to CEM EMLab, This specifies the wave polarization with TM being Hy, Ex, Ez and TE being Ey, Hz, Hx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ampltidue of the te vs tm modes (which are decoupled)\n",
    "pte = 0; #1/np.sqrt(2);\n",
    "ptm = 1; #cmath.sqrt(-1)/np.sqrt(2);\n",
    "polarization_amplitudes = [pte, ptm]\n",
    "## we can specify this...but note there is no differentation of these after we go through an anisotropic layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## two options:\n",
    "We either write it as a second order equation with first order terms or we solve the whole thing.\n",
    "\n",
    "Solving the whole thing appears to be simpler, but we should note a few things. The biggest thing is that the modes for $W$ are not an identity matrix, which is what we typically assume, even for an isotropic medium.\n",
    "\n",
    "## debugging\n",
    "Somehow, even in the TMM formulation, I have an issue with energy conservation as soon as anisotropy is ADDED. Adding anisotropy splits the degeneracy founded in the isotropic version of the problem. This problem occurs only for exy and eyx coupling as well as combined (exz/ezx, eyz/ezy) coupling, something which we will need to figure out.\n",
    "\n",
    "\n",
    "### TM Polarization Status\n",
    "Hy, Ex, Ez, only xz anisotropy should be felt, everything else should be consistent.\n",
    "Only xy fails, which is interesting\n",
    "\n",
    "### TE Polarization Status\n",
    "Ey, Hx, Hz Should not see any anisotropy whatsoever.\n",
    "Only xy fails, which is interesting\n",
    "\n",
    "\n",
    "### Linear Combo of TE and TM Polarizations\n",
    "Interesting case, should see the effect of any anisotropy (because you have nonzero components for all E field components)\n",
    "xz is fine, but yz and xy now fails.\n",
    "\n",
    "### off normal incidence\n",
    "Should still be the same as TE and TM analysis. Does not introduce TE/TM coupling\n",
    "\n",
    "\n",
    "## What's Weird about xy anisotropy "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "ref = [];\n",
    "trans = []\n",
    "wvlen_scan = np.linspace(0.5, 4, 1000);\n",
    "thickness = 0.5; # 1 layer\n",
    "for wvlen in wvlen_scan:\n",
    "    \n",
    "    k0 = 2*np.pi/wvlen;\n",
    "    kx = np.sin(theta)*np.cos(phi);\n",
    "    ky = np.sin(theta)*np.sin(phi);\n",
    "    \n",
    "    # we will build the system by rows?\n",
    "    a11 = -1j*(ky*mu_tensor[1,2]/mu_tensor[2,2] + kx*(epsilon_tensor[2,0]/epsilon_tensor[2,2]))\n",
    "    a12 = 1j*kx*(mu_tensor[1,2]/mu_tensor[2,2] - epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "#     a13 = kx*ky/epsilon_tensor[2,2] + mu_tensor[1,0] - mu_tensor[1,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    a13 = kx*ky/epsilon_tensor[2,2] + mu_tensor[1,0] - mu_tensor[1,2]*mu_tensor[2,0]/mu_tensor[2,2];\n",
    "#     a14 = -kx**2/epsilon_tensor[2,2] + mu_tensor[1,1]-  mu_tensor[0,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    a14 = -kx**2/epsilon_tensor[2,2] + mu_tensor[1,1]-  mu_tensor[1,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    \n",
    "    a21 = 1j* ky *(mu_tensor[0,2]/mu_tensor[2,2] - epsilon_tensor[2,0]/epsilon_tensor[2,2]);\n",
    "    a22 = -1j * kx*(mu_tensor[0,2]/mu_tensor[2,2]) +ky *(epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "    a23 = ky**2/epsilon_tensor[2,2] - mu_tensor[0,0] +  mu_tensor[0,2]*mu_tensor[2,0]/mu_tensor[2,2];\n",
    "    a24 =  -kx*ky/epsilon_tensor[2,2] - mu_tensor[0,1] + mu_tensor[0,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    \n",
    "#     a31 = (kx*ky/mu_tensor[2,2] + epsilon_tensor[1,0] - epsilon_tensor[1,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2])\n",
    "    a31 = (kx*ky/mu_tensor[2,2] + epsilon_tensor[1,0] - epsilon_tensor[1,2]*epsilon_tensor[2,0]/epsilon_tensor[2,2])\n",
    "    a32 = (-kx**2/mu_tensor[2,2] +epsilon_tensor[1,1] - epsilon_tensor[1,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "#     a33 = -1j*(ky*(epsilon_tensor[1,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,0]/mu_tensor[0,0]));\n",
    "    a33 = -1j*(ky*(epsilon_tensor[1,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,0]/mu_tensor[2,2]));\n",
    "#     a34 = 1j*kx*(epsilon_tensor[1,2]/epsilon_tensor[2,2]+mu_tensor[2,1]/mu_tensor[2,2] )\n",
    "    a34 = 1j*kx*(epsilon_tensor[1,2]/epsilon_tensor[2,2]-mu_tensor[2,1]/mu_tensor[2,2] )\n",
    "    \n",
    "    a41 = ky**2/mu_tensor[2,2] - epsilon_tensor[0,0] +  epsilon_tensor[0,2]*epsilon_tensor[2,0]/epsilon_tensor[2,2];\n",
    "    a42 = -kx*ky/mu_tensor[2,2] - epsilon_tensor[0,1] + epsilon_tensor[0,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2];\n",
    "#     a43 = 1j*ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2]+mu_tensor[2,0]/mu_tensor[2,2] );\n",
    "    a43 = 1j*ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2]-mu_tensor[2,0]/mu_tensor[2,2] );\n",
    "#     a44 = -1j*(ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,1]/mu_tensor[2,2]));\n",
    "    a44 = -1j*(kx*(epsilon_tensor[0,2]/epsilon_tensor[2,2])+ky*(mu_tensor[2,1]/mu_tensor[2,2]));\n",
    "    \n",
    "    A = np.matrix([[a11, a12, a13, a14],\n",
    "                  [a21, a22, a23, a24],\n",
    "                  [a31, a32, a33, a34],\n",
    "                  [a41, a42, a43, a44]]);\n",
    "    \n",
    "    #print(np.linalg.cond(A))\n",
    "    eigenvals, eigenmodes = np.linalg.eig(A);\n",
    "    rounded_eigenvals = np.round(eigenvals, 3)\n",
    "    #print(eigenvals)\n",
    "    \n",
    "    #print(np.round(eigenvals,3)); print(np.round(eigenmodes,3))\n",
    "    \n",
    "    ## suppose we directly diagonalize this matrix.\n",
    "    \n",
    "    \n",
    "    ## we need to siphon off the forward propagating modes.\n",
    "    sorted_eigs, sorted_inds = nonHermitianEigenSorter(np.round(eigenvals,10));\n",
    "#     sorted_inds = [1,3];\n",
    "#     sorted_eigs = eigenvals[sorted_inds];\n",
    "    #print(sorted_eigs) ## since we have Ey, Ex, Hy, Hx, on a uniform slab, there is a 2-fold degeneracy \n",
    "    \n",
    "#     plt.plot(np.real(rounded_eigenvals), np.imag(rounded_eigenvals), 'o')\n",
    "#     plt.plot(np.real(sorted_eigs), np.imag(sorted_eigs), '.r')\n",
    "#     plt.show()\n",
    "    \n",
    "    ## ========================================================\n",
    "    W_i = eigenmodes[0:2, sorted_inds];\n",
    "    V_i = eigenmodes[2:, sorted_inds];\n",
    "    Om =  np.matrix(np.diag(sorted_eigs) );\n",
    "    #print(np.round(W_i,3), np.round(V_i,3), np.round(Om,3))\n",
    "    \n",
    "    #then what... match boundary conditions... try using the gaylord formulation.\n",
    "    # or use the scattering matrix formalism, where we still, technically deal with all field components...\n",
    "    \n",
    "    Sg11 = np.matrix(np.zeros((2, 2))); Sg12 = np.matrix(np.eye(2, 2));\n",
    "    Sg21 = np.matrix(np.eye(2, 2)); Sg22 = np.matrix(np.zeros((2, 2)));  # matrices\n",
    "    Sg = np.block([[Sg11, Sg12], [Sg21, Sg22]]);  # initialization is equivelant as that for S_reflection side matrix\n",
    "\n",
    "    ### ================= Working on the Reflection Side =========== ##\n",
    "    Pr, Qr, kzr = pq.P_Q_kz(kx, ky, e_r, m_r)\n",
    "\n",
    "    ## ============== values to keep track of =======================##\n",
    "    S_matrices = list();\n",
    "    kz_storage = [kzr];\n",
    "    X_storage = list();\n",
    "    ## ==============================================================##\n",
    "\n",
    "    # define vacuum wavevector k0\n",
    "    lam0 = wvlen;  # k0 and lam0 are related by 2*pi/lam0 = k0\n",
    "    k0 = 2*np.pi/lam0;\n",
    "    ## modes of the layer\n",
    "    Om_r = np.matrix(cmath.sqrt(-1) * kzr * I);\n",
    "    X_storage.append(Om_r);\n",
    "    W_ref = I;\n",
    "    V_ref = Qr * Om_r.I;  # can't play games with V like with W because matrices for V are complex\n",
    "    #print(Om_r)\n",
    "    ## calculating A and B matrices for scattering matrix\n",
    "    Ar, Br = sm.A_B_matrices(Wg, W_ref, Vg, V_ref);\n",
    "\n",
    "    S_ref, Sr_dict = sm.S_R(Ar, Br);  # scatter matrix for the reflection region\n",
    "    S_matrices.append(S_ref);\n",
    "    Sg, D_r, F_r = rs.RedhefferStar(Sg, S_ref);\n",
    "\n",
    "    # longitudinal k_vector\n",
    "    ## ============ WORKING INSIDE ANISOTROPIC LAYER ================#\n",
    "    # now defIne A and B\n",
    "    Al, Bl = sm.A_B_matrices(Wg, W_i, Vg, V_i);\n",
    "\n",
    "    # calculate scattering matrix\n",
    "    S_layer, Sl_dict = sm.S_layer(Al, Bl, thickness, k0, Om)\n",
    "    S_matrices.append(S_layer);\n",
    "\n",
    "    ## update global scattering matrix using redheffer star\n",
    "    Sg, D_i, F_i = rs.RedhefferStar(Sg, S_layer);\n",
    "\n",
    "    ##========= Working on the Transmission Side==============##\n",
    "    Pt, Qt, kz_trans = pq.P_Q_kz(kx, ky, e_t, m_t);\n",
    "    kz_storage.append(kz_trans);\n",
    "\n",
    "    Omt = cmath.sqrt(-1) * kz_trans * I;\n",
    "    Vt = Qt * np.linalg.inv(Omt);\n",
    "\n",
    "    # get At, Bt\n",
    "    At, Bt = sm.A_B_matrices(Wg, I, Vg, Vt)\n",
    "\n",
    "    ST, ST_dict = sm.S_T(At, Bt)\n",
    "    S_matrices.append(ST);\n",
    "    # update global scattering matrix\n",
    "    Sg, D_t, F_t = rs.RedhefferStar(Sg, ST);\n",
    "\n",
    "    K_inc_vector = n_i * k0 * np.matrix([np.sin(theta) * np.cos(phi), \\\n",
    "                                         np.sin(theta) * np.sin(phi), np.cos(theta)]);\n",
    "\n",
    "    # cinc is the c1+\n",
    "    E_inc, cinc, Polarization = ic.initial_conditions(K_inc_vector, theta, normal_vector, pte, ptm)\n",
    "\n",
    "    ## COMPUTE FIELDS\n",
    "    Er = Sg[0:2, 0:2] * cinc;  # S11; #(cinc = initial mode amplitudes), cout = Sg*cinc; #2d because Ex, Ey...\n",
    "    Et = Sg[2:, 0:2] * cinc;  # S21\n",
    "\n",
    "    Er = np.squeeze(np.asarray(Er));\n",
    "    Et = np.squeeze(np.asarray(Et));\n",
    "\n",
    "    Erx = Er[0];  Ery = Er[1]; Etx = Et[0]; Ety = Et[1];\n",
    "\n",
    "    # apply the grad(E) = 0 equation to get z components, this equation comes out of the longitudinal equation \n",
    "    # or the divergence equation and is valid since the transmission region is VACUUM (as is the reflection region)\n",
    "    Erz = -(kx * Erx + ky * Ery) / kzr; #uses the divergence law\n",
    "    Etz = -(kx * Etx + ky * Ety) / kz_trans;  ## using divergence of E equation here\n",
    "\n",
    "    # add in the Erz component to vectors\n",
    "    Er = np.matrix([Erx, Ery, Erz]);  # a vector\n",
    "    Et = np.matrix([Etx, Ety, Etz]);\n",
    "\n",
    "    R = np.linalg.norm(Er) ** 2;\n",
    "    T = np.linalg.norm(Et) ** 2;\n",
    "    ref.append(R);\n",
    "    trans.append(T);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.  -0.j  0.  +0.j  0.25+0.j  0.75+0.j]\n",
      " [ 0.  +0.j  0.  +0.j -0.75+0.j -0.25+0.j]\n",
      " [ 0.25+0.j  0.75+0.j  0.  -0.j  0.  +0.j]\n",
      " [-0.75+0.j -0.25+0.j  0.  +0.j  0.  -0.j]]\n",
      "(4, 4)\n",
      "[[ 0.5         0.5        -0.70710678]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(None,)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(A)\n",
    "print(A.shape)\n",
    "print(E_inc), #one x and one z\n",
    "# print(Wg)\n",
    "# print(Vg)\n",
    "# print(Om_r)\n",
    "# # print(ref)\n",
    "# # print(trans)\n",
    "# # print(np.round(eigenmodes,3))\n",
    "# # print(sorted_inds)\n",
    "# # print(Vg)\n",
    "# print(eigenvals)\n",
    "# print(np.round(eigenmodes))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3ic1Zn38e89o967rWJJLnLvlgvdJpBQEiAJLJACIQWSkM2bTUI22UJ22exeaZvspmyIAwQWQoCwSXCIgRSaDbax3Lsty5ZVLavLVp857x9nLMlCtsb2jGbm0f25rrlGmudo5tZY+vnROec5R4wxKKWUinyuUBeglFIqMDTQlVLKITTQlVLKITTQlVLKITTQlVLKIaJC9cJZWVmmuLg4VC+vlFIRacuWLY3GmOyRjoUs0IuLiykrKwvVyyulVEQSkcqzHdMuF6WUcggNdKWUcggNdKWUcggNdKWUcggNdKWUcohRA11EHhORBhHZfZbjIiI/EpFyEdkpIosDX6ZSSqnR+HOG/jhw3TmOXw+U+G73Aj+7+LKUUkqdr1HnoRtj3hSR4nM0uRn4X2PX4d0oImkikmuMqQtQjWf4zjvfYX/z/ot7EmOgsxH6eyA+DWKSAlOcUkr5YWbGTP5+2d8H/HkDcWFRPlA15PNq32PvCnQRuRd7Fk9hYWEAXvoCeD3QsBe62+znLUBaEaRNCk09SikVIIEIdBnhsRF3zTDGrAZWA5SWll7QzhoX/b/ami9C5WG46ccw/Xp45Ruw81m44XZY9pmLe26llAqhQAR6NTD09LYAqA3A8wbesY2w9Qm47P/Boo/Zx255GLpa4OVvwOQrIXtGaGtUSqkLFIhpi2uAu3yzXVYAbcHqP79ob34fErLgqq8PPuZywc3/AzEJ8NLXbP+6UkpFIH+mLf4a2ADMEJFqEfmUiHxWRD7ra7IWqADKgV8Anw9atRejYT+U/xlWfM6G91BJ2bDqn6DidTj4ckjKU0qpi+XPLJc7RzlugPsDVlGw7HgaXFGw+O6Rj5feAxt+Am9+D6ZfBzLS0IBSSoWv8XGlqNcDO5+Dadfas/GRuKPh8i9BzRaoeG1s61NKqQAYH4FeswU66mDeredut/CjkJwL634wNnUppVQAjY9AP/gKiBumvefc7aJiYfl9cHQdNOwbm9qUUipAxk+gF66A+PTR2y66C9yxsPmR4NellFIB5PxAb6uB47ug5L3+tU/MhDkfhB3PQE9HcGtTSqkAcn6gH3nD3k+7xv+vWfYZ6D1pQ10ppSKE8wO98m2IS4Oc2f5/Tf4SmDjfXlWqlFIRwvmBfmyD7T93nce3KgKLPg71u6BuZ/BqU0qpAHJ2oJ9sgKZyKLzk/L923q3gjoHtvwp8XUopFQTODvRjG+190aXn/7UJGTDzRrsSY39PYOtSSqkgcHigb4CoOMhdeGFfv/BjdiXGAy8Fti6llAoChwf6RjvAGRVzYV8/dRUk52m3i1IqIjg30D19cHwP5C268OdwuWHhnVD+F2gPzyXelVLqNOcGeuMh8PRA7oKLe56FHwXj1TnpSqmw59xAr/dNN5w47+KeJ3MqFF5qu1108wulVBhzbqDX7bQDopklF/9ciz5qpz+enjWjlFJhyLmBXr/TXh3qDsC2qbNvgZgk2PbkxT+XUkoFiTMD3Rgb6LnzA/N8sUkw90Ow53fQ3R6Y51RKqQBzZqC3VUF3m12PJVAW3w19nbDnt4F7TqWUCiBnBvrp9VcCGej5SyB7FmzVbhelVHgKQAdzGKrfBeKCCXMC95wisPjj8Mo/2N2McmYF7rmVUs7T1wWtxwZvbdW296C1Ci77ol1aJMAcGug7IXMaxCQE9nnn3wF//qY9S7/uPwL73EqpyOLph/ZqaKmE1sp33588fmZ7VxSk5ENaoT3hDAJnBnrdTrtkbqAlZsLMG2DnM3DNv1z4kgJKqfBnDHTUjxzWrZV2NzTjGWwvbkjNh7QiKLkW0oohvcgGeOokSJ5orz4PIucFemez/V8zUDNchlt0F+x9AQ6shTm3BOc1lFJjw+uFjjpoPgzNFfbWdBiaj0DLETsRYqikiTakJ62A+UU2vE+HdkpBYKZJXwTnBXqgrhA9m6mr7D/ctic10JWKBF4vtNf4Avt0cB+xwd1yBPq7B9u6YyB9MmRMsb/r6cX2llYEaZMgOj5U34VfHBjou+x9IGe4DOVy2ytH3/iu/aHImByc11FKnZ+uVntFd+NB3+2Q/bz5iF3X6bSouMHQnvYeu7xHxhR7S8kPerdIMDkv0Ot22iVvE7OC9xpL7oF1/wmbH4H3/XvwXkcpdSav13apng7sofdDByFd0TaoM6dByXttWJ8O7uS889uSMoI4L9ADeYXo2aTkwqybbLfLqn+AmMTgvp5S401/rz27btg7GNhNh6CxHPq7BtvFpUH2DDsImTV98JZWFPL+7FBw1nfc12X/4WfdFPzXWn6fvWp057NQ+sngv55STuT12C6Rhr1wYr+9b9hnw9zb72skduAxazpMvgqySgaDOyHTXiOiAKcF+vG9du3yYA2IDjVpue2n37TadsHoD5VSZ+f12otqhoZ2wz57AjZ0UDK92C6qN+MGe58z03abhPlgZLhwVqCfnuES7C4XsAG+/D544X448iZMuSr4r6lUJOg5aUO7fifU77YTFU7sh96Tg21S8iF7Jky+0hfcs2zXiXZfXhS/Al1ErgP+G3ADjxhjvj3seCHwBJDma/N1Y8zaANc6uvqdEJtq+8/GwtwPw5/+GTb+TANdjT/G2Dnc9bvOvDVXAL7NYOJSYcI8u/NXzixfcM+E+LSQlu5Uowa6iLiBnwLXAtXAZhFZY4zZO6TZPwHPGWN+JiKzgbVAcRDqPbe6nba7Zay6P6LjYdm98Ma3bXfPhNlj87pKjTVPv+0eqd/lO/PeBcd3Q2fTYJv0Yvv7N/92ez9xHqQWaHfkGPLnDH0ZUG6MqQAQkWeAm4GhgW6AFN/HqcDY76js9dhNoUvvGdvXXX4fvP1jeOu/4EOrx/a1lQoGr8eGd+02qN1u7+t3Dc4uccfak5cZN9hxpInz7EJ4cSnnfl4VdP4Eej5QNeTzamD5sDb/AvxJRP4WSASuGemJRORe4F6AwsLC86313Jp805nGYkB0qIQM+5/Ixp/ZKYzpxWP7+kpdDK/H/u6cDu7abfYM/PQl79GJdqP10k/a+9z5dlvHcTglMBL4868y0t9Lw3dLvhN43BjznyJyCfCkiMw1xnjP+CJjVgOrAUpLSwO743KwrxA9l0vuh3dWw1s/gvf/YOxfXyl/GGMvda/eAnW+AK/bMThYGRVvA3vxXZC3yN4yp0X0lZPjjT+BXg1MGvJ5Ae/uUvkUcB2AMWaDiMQBWUBDIIr0S90Ouw5D9owxe8kBKXmw4E7Y9hRc+VX7uVKh1t0GNVuhugyqN0NN2WCfd1Sc/Wt24Ucgd6EN76zpeuYd4fz519sMlIjIZKAGuAP4yLA2x4D3AI+LyCwgDjgRyEJHVb/LjqC7o8f0ZQdc8WXY/rRd4+UD/xWaGtT45fXYqYHVm323MjhxgIE/prNmwPTroaDU3rJnhu53RQXNqIFujOkXkS8Ar2CnJD5mjNkjIg8BZcaYNcBXgF+IyN9hf4I+YYwJbJfKuYu0/X4zbhizl3yX9GLbl775Ubj0b+26EUoFy6lGqHpnMMBrtw12ncSnQ8FSO622oBTyFus0wXHCr7+vfHPK1w577MEhH+8FLgtsaeehvdb+KRmK/vOhrnwAtv0KXv0W3PbL0NainMMYO7f72EY4tsHeNx2yx1xRMGGu7fIrWGoDPGOKThUcp5zRYRbsNdD9lZQDl3we3vweXPoFu7G0UufL029/pocG+CnfcFRcmt2Na9FH7SYLeQv1sng1wBmBXrsdkNAHOsClX4QtT8Dar8Gn/uzYZTpVAPWctN0mpwO8ugz6TtljaYV2o4XCFVB4ie0L158pdRbOCPS67XaEPjYp1JXYiyuufQh+/1nY8Wt7JqXUUN1tNryProOj6+0VzsZjNw6eMBcWfcwX4Ct0xpQ6Lw4J9B12kZ9wMf922PJL+Ms3YeaNOiA13r0rwHfYVUHdMbbf+4ov27PvgqV6taW6KJEf6B3H7QJBuQtDXckglwtu+B6sXgl/fhBu+lGoK1JjabQAv/IBKL7cfqz93yqAIj/Q67bb+7wwCnSwl0lf8gV4+0cw+2a7d6FyJg1wFSYiP9DDaUB0uFX/CAdfhjVfhM+/bZcSVZGvv8cOYh5+DSpeh9qtGuAqLER+oNdtt+tNxCaHupJ3i46DWx6GR6+BP37Vrsao84Mjj9cLDXtseFe8DpVv28WrxG2npl7xFTuGowGuQizyA712OxSH7pqmURUsgZXfgNf+HYouHfvlfdWFaa3yBfhrUPEGdDbax7Omw6KPw5SV9udO/+pSYSSyA73jOHTUhteA6Eiu+KqdX/zS30P+Ytu/rsJLVwscWTd4Ft582D6eNMGOf0xZaTcoTs0PXY1KjSKyA736HXtfsDS0dYzG5YIP/QIevgKe+Sh8+i+QPDHUVY1v/T1QtWkwwGu32X7w6ETb/73sMzbEs2dqN5mKGJEd6FWb7O4p4TbDZSSJWXDnr+GX18PTt8M9a3VD3LHk9dot0053o1RusBuiiNs3kPk1G+D5SyAqJsTFKnVhIjvQj22y6zhHxYa6Ev/kLYRbH4NnPgK/uQduf0rDI5haKgfPwI+8MbgWePZMWHK3DfCiy/RiHuUYkRvofd12hsvyz4a6kvMz43q48T/hxb+D5++B2x7XdakDpbPZzgWveN1OKWw5Yh9Pmggl7x3sB0/JDWGRSgVP5AZ63Xbw9Nr1LiJN6SftinovPQC/+QR8+FE7xVGdn75uqNo4pB98O2AgJgmKr7D/2U9ZaXex0n5wNQ5EbqAfeRMQu4RoJFp+L2Dgpa/Bk7fAHU/bDafV2Xm9dlnZ0/3gxzZCf7ddE7xgmZ0eOmWlnUmkf/WocShyA/3wq7ZPOjEz1JVcuOX3QWI2/O4+ePRa26eeMyvUVYWX5iND+sHfhK5m+3jObPuXzpSVdn5/OF5YptQYi8xA7263229d/qVQV3Lx5n4IknPhubtg9Srbvz6el9ztqLfroRx504Z4a6V9PDnPjj9MWWmvytRpn0q9S2QG+tF1dv3oqVeHupLAKLoEPrse/u9T8MLn4dArcP13x0dotddB5Vu+ha3eGtxaLTbF9oNf8gUb4lkl2g+u1CgiM9APvmwHvgqWhbqSwEmeAHe9AOt/CG98Fw6/Dtc8CIvvdlZ/cHutDe7K9fZMvKncPh6bYtcEX3yXvbBn4nxwR+aPp1KhEnm/Mf29sHcNzLjBeXO4XW648qsw+xZ48Uvwx6/Ahv+BVf8Acz5oj0cST5+9mKdqs70IrPodaD1mj8Wm2L7vJZ8YDPBI+/6UCjORF+iHX4XuVph3a6grCZ6saXD3H+xfIn/9N9sV89eHYOmn7fZk4Tgbxhhor7FrgVeX2TGO2q12VUKw4wSTlsGy++yiVhrgSgVc5AX6yeOQPhmmrAp1JcElYgcBS94H+/8Am34Of/5nePVbMO0amHMLTH9faFb783rs7JP6HXY/zLoddjrh6SsxXVF2ffrFd9nL6icth9QC7QNXKsjEGBOSFy4tLTVlZWUX9sXGjM9wqN8N256EvS/YbffEbaduFl8BBaUwYQ6kFQdmV3ivF06dgLZqaK6AxoPQeAAaD9l+b0+vbeeKtlMtc+fbVS9zF9iNjmMSLr4GpdS7iMgWY0zpiMciMtDHO6/X9keX/8Uu+VpTBt5+eyw6ETIm293iU/Ls8q/RCXYhsOgE283h7R+89Z6yS8d2tdqurJMnoL0a2mrA2zf4muKC9GK7Hvjp28R5NswjZS0dpRzgXIEeeV0uyp6BF64YXPagtxMa9tlddY7vsYtSddTaJWFPnfDj+aIgPh3i0uyqkAVL7cBsaoG9pRVB5lQNbqXCnAa6E8Qk2J2RCpa8+5jXawcm+zrt2TjGdtW4ouzZekySPXsfj11YSjmMBrrTuVwQm2RvSilHC8DomVJKqXCgga6UUg7hV6CLyHUickBEykXk62dp8zcisldE9ojI04EtUyml1GhG7UMXETfwU+BaoBrYLCJrjDF7h7QpAb4BXGaMaRGRnGAVrJRSamT+nKEvA8qNMRXGmF7gGeDmYW0+A/zUGNMCYIxpCGyZSimlRuNPoOcDVUM+r/Y9NtR0YLqIvCUiG0XkupGeSETuFZEyESk7ccKP+dFKKaX85k+gjzRBefjlpVFACbASuBN4RETS3vVFxqw2xpQaY0qzs7PPt1allFLn4E+gVwOThnxeANSO0OYFY0yfMeYIcAAb8EoppcaIP4G+GSgRkckiEgPcAawZ1ub3wCoAEcnCdsFUBLJQpZRS5zZqoBtj+oEvAK8A+4DnjDF7ROQhEbnJ1+wVoElE9gKvAQ8YY5qCVbRSSql309UWlVIqgpxrtUW9UlQppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRxCA10ppRzCr0AXketE5ICIlIvI18/R7lYRMSJSGrgSlVJK+WPUQBcRN/BT4HpgNnCniMweoV0y8EVgU6CLVEopNTp/ztCXAeXGmApjTC/wDHDzCO3+Dfgu0B3A+pRSSvnJn0DPB6qGfF7te2yAiCwCJhljXjzXE4nIvSJSJiJlJ06cOO9ilVJKnZ0/gS4jPGYGDoq4gB8CXxntiYwxq40xpcaY0uzsbP+rVEopNSp/Ar0amDTk8wKgdsjnycBc4HUROQqsANbowKhSSo0tfwJ9M1AiIpNFJAa4A1hz+qAxps0Yk2WMKTbGFAMbgZuMMWVBqVgppdSIRg10Y0w/8AXgFWAf8JwxZo+IPCQiNwW7QKWUUv6J8qeRMWYtsHbYYw+epe3Kiy9LKaXU+dIrRZVSyiH8OkNX4a+9u4+D9R3sq++gurmT+vZu6tq6aTzZQ2ePh87efrr6PBgDLpcQ5RLcLiExJorU+GhSE6JJjY8mMzGGvLR4clPjyEuL993iiI1yh/pbVEqNQgM9QjWe7GH9oUY2HG5i45EmKps6B47FRLmYmBLHxNQ4Zk1MISHGTUKMm/iYKNwu6PcaPB5Dv9fQ2dtPa2cfbV19VDV3su1YK40ne854LZdAYUYCU7OTmJqTxDTf/cyJySTG6o+QUuFCfxsjSFtnH3/YWcsfd9ax6UgTXgMpcVEsn5LJ35ROYlZuMjMmppCXGofISJcP+Ken30N9Wzc1rV3UtnZzrOkUh0+corzhJOsONdLr8QIgApOzEpmbl8qcvBTm5tv7tISYQH3LSqnzEHGB/sqeep7dXMUjd5Xicl14aEWSA/UdPP72UX6/rYauPg9TshO5f9U03jt7IrPzUnAH+H2IjXJTlJlIUWbiu455vIbqlk4OHj/Jnto29tS2U3a0mTU7Bi9NKMpMYElhOouK0llSmM6MickBr1Ep9W4RF+jdfR5e3d9AWWULyyZnhLqcoCpv6OAHfz7I2l31xEa5uGVhPh+/pIg5eSkXdQZ+MdwuGQj7a2dPGHi8+VQve2rb2F3TzvaqFt481Mhvt9UAkBjjZsGkNJYUpbO4KJ3SonSS46JDUr9SThZxgX7NrAnERbtYs6PGsYHe1tXH917Zz9ObjhEf7eaL7ynhnkuLSU8M366MjMQYrijJ5ooSu6SDMYbqli62VLaw9VgLWypb+J/XD+PxGlwCc/NTWTElkxVTMigtziBFA16piybGmNFbBUFpaakpK7uwi0nvf3orGw838c4/XuO4P+Vf3l3Hgy/sofFkD3ddUszfXj2NzKTYUJcVEKd6+tle1cqmiiY2Hmlm+7FWej3egYBfPjmDFVMyWTpZA16psxGRLcaYEZdWibgzdID3zp7AH3fWsae2jfkFaaEuJyC6+zz86x/28ut3jjEnL4VH717KvILUUJcVUImxUVw2LYvLpmUB9nveeqyFjRXNbKxo4om3K/nFuiO4BObkpXLZtCwun5ZFaXE6cdE6bVKp0URkoJ8OhHWHGh0R6MeaOrnvqS3sq2vns1dN5SvvnU602/nXfMVFu7l0ahaXTh0M+G3HWtlY0cTbhxt5ZF0FD79xmNgoF0uLMwYCPhgDwUo5QUR2uQDc+KN1JMVG8ex9lwSwqrG3vaqVTz2+mX6v4Ye3L+DqmRNG/6Jx4lRPP+8caWZ9eSNvlTeyv74DgLSEaC6dmjkQ8CPNxlHKqRzX5QJwRUk2j6yr4GRPP0kRenHLa/sb+NyvtpCTHMfj9yxlSnZSqEsKK4mxUayamcOqmTkANHR0s+FwE+sPNbK+vJG1u+oBmJQRz+W+rpxLp2aREcaDx0oFU2QmIXDZtEwefuMwWytbuHJ65G2W8er+43z2ya3MmJjML+9ZSpZDBj6DKSc5jpsX5nPzwnyMMVQ0nuKt8kbWH2rkxZ11/Podu7HWnLyUgYBfWpxBfIz2v6vxIWIDfVFhOi6BsggM9NcPNAyE+VOfXk5qvM7oOF8iYpciyE7irkuK6fd42VXTxlvljaw71Mhjbx3h529WEON2saQonctLbPfM3PxU7X9XjhWxfegAN/z3OjISY3jq08sDVFXw7a5p47aHNzA5K5GnP7NcL5MPks5e2//+Vnkj68ub2FfXDtilEi6dmsVlvoAvzkwI2UVaSl0IR/ahAywpSue3W6vp93iJioBZIbWtXXzy8c1kJMbw+CeXapgHUUJMFCtn5LByhu1/bzzZw9uHm1h/6ATrDzXy8h7b/56f5ut/L8ni0qmZ2vWlIlpEB3ppcTpPbqzkwPEO5uSF95zt7j4Pn3qijK5eD09+bjk5yXGhLmlcyUqK5aYFedy0IA9jDEebOu3smUONvLS7jmfLbP/7rNwULp+WyeUl2SzT/ncVYSI60BcXpgOwtbIl7AP9my/sYV9dO7/8xFJmTEwOdTnjmogwOSuRyVmJfHxFER6vYXdNG+t9A6ynL3CKcbtYXJQ2MMA6Lz81Iv4SVONXRAd6QXo86QnR7KppC3Up5/T8lmqeLavi/lVTB6bgqfDhdgkLJqWxYFIa96+aRlevh81HmwcGWL//p4N8/08HSY6L4pIpmVxRYgN+clai9r+rsBLRgS4izM1PZXdNe6hLOavKplP88+93s2JKBn93zfRQl6P8EB/j5srp2Vw5PZtvAE2+/vfTAf+nvccByEuNsxc3lWSxYkomE1K0G02FVkQHOsC8/FRWv1lBd58n7Nb78HoNDzy/kyi38MPbF+qf6xEqMymWDyzI4wO+/vdjzZ0D3TN/2nuc32ypBmBKViLLfStIasCrUHBEoPd7DQfqO1gwKbzWdXliw1HeOdLMd2+dT25qfKjLUQEgMrge/EeX2/73PbVtbPItMPbijlp+/c4xQANejb2ID/S5+XYwdFdNW1gFelVzJ995eT+rZmRz25KCUJejgsTtEuYXpDG/II3PXDkFj9ewt7adjRVNGvBqzEV8oBekx5MaH83uMBsY/dYf9yII//7BeTpwNo64XcK8glTmFaSeV8CXFmeQn6Z/xamLE/GBLiLMy08Nq5kubxw8wSt7jvPA+2aQp7+k49r5BHxeahylxRksLU6ntDiD6RN0L1Z1fiI+0MF2uzy6voKefg+xUaEdGO3t9/Kva/ZQnJnAp6+YHNJaVPgZKeD317dTdrSFzUeb2XSkaWDD7eTYKBYXpQ8E/MJJaWE38K/CiyMCfV5+Kn0eOzAa6g0vnt5USUXjKX75iaUh/89FhT+3S5iTl8qcvFTuvrR4YC/WsspmNh9toexoM9//0wkAot12mu7S4gxKi9JZUpTumO0JVWA4ItDn5qcAsLe2PaSBfrKnnx+/Ws4lUzJZOSOyVoBU4UFEmJSRwKSMBD64yA6mt3b2sqWyZSDgH3/rKKvfrACgKDOBRZPSWFSYzqLCNGZOTCEmSqfHjleOCPRJ6QkkxUaxpza0Fxg9tv4ITad6+dp1M3QgVAVMWkIM75k1gffMsrtZdfd52F3TxuajLWyvauGtw038frvtpomNcjE3P/WMkM9NjdOfx3HCEYHucgmzc1PYWxe6QG8+1cvqNyt435wJLPKtMaNUMMRFuykttjNjAIwx1LZ1s/1YK9uOtbCtqpX/3VjJI+uPAJCTHMuiQl/AT0pjXkEqCTGO+NVXw/j1ryoi1wH/DbiBR4wx3x52/MvAp4F+4ATwSWNMZYBrPafZeSk8V1aFx2tCMjPgkXUVnOrt56vvnTHmr63GNxEhPy2e/LR4bpyfC9jB+f317WwbEvKv7LFLFrgESnKSmVeQyvyCVObmpzI7N0UHXB1g1EAXETfwU+BaoBrYLCJrjDF7hzTbBpQaYzpF5HPAd4Hbg1Hw2czOS6Gz10Nl06kx35uzrauPJzdUcsPcXEom6EqKKvRiolwDFzzdfWkxYNek2VHdyvZjreysaeO1/Q0871u2wO0Spk9IZl5+CvMK0pifn8rM3GQd2I8w/pyhLwPKjTEVACLyDHAzMBDoxpjXhrTfCHwskEX6Y06eHRjdU9s+5oH+1MZKOnr6+dzKqWP6ukqdj8ykWK6eOYGrZ9q+eGMMdW3d7KxuY3dNGztr2vjz3uM8V2ZDPtptQ35+QSrz8tOYl59KyYQkPZMPY/4Eej5QNeTzauBce759CnhppAMici9wL0BhYaGfJfqnJCeZaLewp7adDyzIC+hzn0tXr4fH1h/hqunZA8sQKBUJRIS8tHjy0uK5bu5EwIZ8TWsXu6ptwO+uaWPtrvqBDbjdLmFadhKz81KYlZvM7NxUZuUm6/TJMOFPoI/UIT3iRqQi8jGgFLhqpOPGmNXAarB7ivpZo19iolyU5CSP+cDos5uP0XSql/tXTRvT11UqGESEgvQECtITuH6e7Y83xlDV3MWumjb21Slk9AAAAA1WSURBVLWzt66dDYeb+N22moGvm5ASy+zcFF/QpzA7N4XizERceqXrmPIn0KuBSUM+LwBqhzcSkWuAfwSuMsb0BKa88zM7L4XXDzRgjBmTaVoer+EX645QWpTOsskZQX89pUJBRCjMTKAwM2Fg0BXszK59de3srW0fCPp1hxrp99pztYQYNzMmJjM7N4WZE5OZPsHe0hN1L91g8SfQNwMlIjIZqAHuAD4ytIGILAJ+DlxnjGkIeJV+mpOXwvNbqjnR0UPOGKxk95d9x6lp7eKfbpwV9NdSKtxkJMZwmW97vtN6+j0cOn6SvXXtA2G/Zkctv9rUP9AmOzmWGROSKZmQxIwJyUyfmExJThLJcdGh+DYcZdRAN8b0i8gXgFew0xYfM8bsEZGHgDJjzBrge0AS8BvfmfExY8xNQax7RLNzBwdGxyLQn3j7KHmpcVw7e0LQX0upSBAb5WZufuoZ40nGGOrbuzlQ38Gh4yc5cLyDg8c7eOadKrr6PAPt8tPimT4hiekTk5mek8yMiclMy9FB2PPh1zx0Y8xaYO2wxx4c8vE1Aa7rgswemOnSFvS9Ow8e7+Dtw0088L4ZuhORUucgIuSmxpObGs/KGYO/l16vXbfmdMAfPN7BgfoO3ipvotfj9X2tvRJ8anYiU7OTmJqTZO+zE8lIjNErYIdx1OViyXHRFGUmjMnA6BNvHyUmysWdywI7W0ep8cLlGuybH/pXbr/Hy9GmzoGAP3ziJIdPnOLtw0309HsH2qUlRA+Eu723gT8pPX7cnmQ5KtDBdrsEe02Xtq4+fru1hpsX5JGhAzxKBVSU28W0nCSm5SRxw7zBQViv106pPB3wh0+c5HDDSV7df2Jg7jzY+fPFmTbkp2QnUpyZSHFWIsWZCWQnxzr6rN5xgT4nL4WXdtfT0d0XtEGW57dU09XnGbgCTykVfC7X4EqUK4etsNHW2cfhRhvwp8P+YEMHf9l3fGDWDdiZN0WZNtxP39uwTyQnOTbip1k6LtBP96Pvq+sIylRCYwzPvHOMRYVpeiGRUmEiNSGaxYXpLB62MF6/x0ttazdHmk5R2XSKo42dHG06xYHjNuz7PINhHxftojgzkaLMhIGz+iLffyC5qXER0Y3juECfk2dDdk9tW1ACfVtVK4caTvLtD80L+HMrpQIryu0a6KeHM/co8HgNta1dHG06xdGmTiob7f3hE6d4bf+JgYFZsFfI5qbGMSk9gUkZ8b77wY+zksLj7N5xgZ6THEtWUgx7g9SP/tzmKhJi3Lx/DJcXUEoFnntIF84VJWce83jtVMvKxlNUtXRS1dzlu+/k9QMnaOg489rJ2CgX+enx7w789AQK0uNJS4gek757xwW6iDArSAOjp3r6+cOOWm6cl0tSrOPeOqWUj9s1uCTxSLr7PFS32JCvbu6kqqWLquZOqlo62V7VSltX3xntE2Pc5KXFk59un/OWRfksLQ58D4IjU2lOnt00urffG9DtuP64q45TvR5uXzpp9MZKKceKi3YPzMQZSXt3nw345i6qWzqpae2itrWLmtYudlS1snBSmga6v2bnpdDnMRxq6BjoUw+EZzdXMSU7kSVFuiORUursUuKiBzb/HokxAV2bcED4D9tegKFrowdKeUMHWypbuL10kqPnsSqlgi9YGeLIQC/OTCQ+2h3QgdHnyqqJcgkfWlwQsOdUSqlAcmSgu13CrNzkgAV6n8fLb7dWc/XMHLKTdSF/pVR4cmSggx0Y3VvXjtd78X1Vf93XQOPJXh0MVUqFNccG+uy8FE729FPV0nnRz/WbsipykmO5anr26I2VUipEHBvogRoYbejo5vWDJ/jQ4oKIuPRXKTV+OTahpk9Ixu2Si+5H/93WGjxew22lOhiqlApvjg30uGg3JTlJ7Kppu+DnMMbwXFkVS4rSmZo98gUESikVLhwb6ACLCtPZWtmC5wIHRrdVtXL4xCluW6Jn50qp8OfoQF82OZ2Onn72119Yt8tvyqqJj3afsdO5UkqFK0cH+um1EsqOtpz313b1evjDjlqunzdRdyNXSkUERwd6QXoCealxvHO0+by/9uU9dZzs6ee2JTr3XCkVGRwd6AClxRlsPtJ83ovhPLe5msKMBJYHYZMMpZQKBscH+tLJGTR09HCs2f8LjMobTrKhoom/KS0Ii11IlFLKH44P9EunZgLw5sETfn/NrzZVEu0Wbl9aGKyylFIq4Bwf6FOy7Kavr+5v8Kt9Z28/z2+p5vq5uboQl1Iqojg+0EWEq2fm8PbhJrp6PaO2f2F7LR3d/dx1SdEYVKeUUoHj+EAHuHpmDj39Xt4+3HjOdl6v4dH1R5iVm6K7EimlIs64CPRlkzNIiYvixZ1152z3yp56yhtO8tmrpuiuREqpiDMuAj02ys37F+Tx8u56Tvb0j9jGGMNPXitnclYi75+fN8YVKqXUxRsXgQ7w4cX5dPV5+P22mhGPv7S7nj217Xzuqqm4daqiUioCjZtAX1yYzoKCVFa/WUG/x3vGsc7efr714l5m5abwocX5IapQKaUujl+BLiLXicgBESkXka+PcDxWRJ71Hd8kIsWBLvRiiQj3r5rGseZOntxYecax/1i7j9q2bh66eY5uYqGUilijppeIuIGfAtcDs4E7RWT2sGafAlqMMdOAHwLfCXShgXDt7AmsmpHNd17ez5bKZrxew4//eoinNh7jviunDCzmpZRSkSjKjzbLgHJjTAWAiDwD3AzsHdLmZuBffB8/D/xERMSc7wIqQSYifOfD87nt5xu49eENZCTE0HSql1sW5vHA+2aEujyllLoo/gR6PlA15PNqYPnZ2hhj+kWkDcgEzpj4LSL3AvcCFBaG5rL6nJQ41tx/Ob98+whVzV1cOT2Lmxbk6TRFpVTE8yfQR0q64Wfe/rTBGLMaWA1QWloasrP31IRovnTN9FC9vFJKBYU/I4DVwNBFwQuA2rO1EZEoIBU4/0XIlVJKXTB/An0zUCIik0UkBrgDWDOszRrgbt/HtwKvhlv/uVJKOd2oXS6+PvEvAK8AbuAxY8weEXkIKDPGrAEeBZ4UkXLsmfkdwSxaKaXUu/nTh44xZi2wdthjDw75uBu4LbClKaWUOh96FY1SSjmEBrpSSjmEBrpSSjmEBrpSSjmEhGp2oYicACpHbTiyLIZdhRrmIqneSKoVIqveSKoVIqveSKoVLq7eImNM9kgHQhboF0NEyowxpaGuw1+RVG8k1QqRVW8k1QqRVW8k1QrBq1e7XJRSyiE00JVSyiEiNdBXh7qA8xRJ9UZSrRBZ9UZSrRBZ9UZSrRCkeiOyD10ppdS7ReoZulJKqWE00JVSyiHCOtD92Jz6EyJyQkS2+26fDkWdvloeE5EGEdl9luMiIj/yfS87RWTxWNc4pJbRal0pIm1D3tcHR2o3VkRkkoi8JiL7RGSPiPy/EdqExfvrZ61h8/6KSJyIvCMiO3z1/usIbcJiE3g/aw2bTPDV4xaRbSLy4gjHAv++GmPC8oZdqvcwMAWIAXYAs4e1+QTwk1DX6qvlSmAxsPssx28AXsLu7rQC2BTGta4EXgz1ezqknlxgse/jZODgCD8LYfH++llr2Ly/vvcryfdxNLAJWDGszeeBh30f3wE8G8a1hk0m+Or5MvD0SP/ewXhfw/kMfWBzamNML3B6c+qwZIx5k3Pv0nQz8L/G2gikiUju2FR3Jj9qDSvGmDpjzFbfxx3APuw+tkOFxfvrZ61hw/d+nfR9Gu27DZ8pcTPwhO/j54H3SAg24fWz1rAhIgXAjcAjZ2kS8Pc1nAN9pM2pR/rF+LDvT+znRWTSCMfDhb/fT7i4xPen7UsiMifUxZzm+7N0EfbsbKiwe3/PUSuE0fvr6xbYDjQAfzbGnPW9Ncb0A6c3gR9zftQK4ZMJ/wV8DfCe5XjA39dwDnR/Np7+A1BsjJkP/IXB/+3CkV8baYeJrdj1IhYAPwZ+H+J6ABCRJOD/gC8ZY9qHHx7hS0L2/o5Sa1i9v8YYjzFmIXa/4GUiMndYk7B5b/2oNSwyQUTeDzQYY7acq9kIj13U+xrOgT7q5tTGmCZjTI/v018AS8aotgvhz2bbYcEY0376T1tjd6uKFpGsUNYkItHYgPyVMea3IzQJm/d3tFrD8f311dIKvA5cN+xQ2G0Cf7ZawygTLgNuEpGj2O7iq0XkqWFtAv6+hnOgj7o59bA+0puw/ZXhag1wl282xgqgzRhTF+qiRiIiE0/35YnIMuzPSVMI6xHsvrX7jDE/OEuzsHh//ak1nN5fEckWkTTfx/HANcD+Yc3CYhN4f2oNl0wwxnzDGFNgjCnGZterxpiPDWsW8PfVrz1FQ8H4tzn1F0XkJqAf+z/bJ0JVr4j8Gjt7IUtEqoFvYgdtMMY8jN2T9QagHOgE7glNpX7VeivwORHpB7qAO0LxCzzEZcDHgV2+/lOAfwAKIezeX39qDaf3Nxd4QkTc2P9YnjPGvCjhuQm8P7WGTSaMJNjvq176r5RSDhHOXS5KKaXOgwa6Uko5hAa6Uko5hAa6Uko5hAa6Uko5hAa6Uko5hAa6Uko5xP8HZ5JJjBS3J6AAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ref = np.array(ref);\n",
    "trans = np.array(trans)\n",
    "plt.plot(wvlen_scan, ref);\n",
    "plt.plot(wvlen_scan, trans);\n",
    "plt.plot(wvlen_scan, ref+trans)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## figuring out xy to diagonal anisotropy\n",
    "So what if we diagonalize the xy part?\n",
    "\n",
    "No, that shouldn't be necessary. As Beicheng mentioned, x-y anisotropy should still result in a block sparse matrix!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3,)\n",
      "(3, 3)\n",
      "[[12.  0.  0.]\n",
      " [ 0. 17.  0.]\n",
      " [ 0.  0.  7.]]\n",
      "[[12  5  0]\n",
      " [ 5 12  0]\n",
      " [ 0 10 12]]\n",
      "[[ 0.          0.40824829  0.40824829]\n",
      " [ 0.          0.40824829 -0.40824829]\n",
      " [ 1.          0.81649658  0.81649658]]\n"
     ]
    }
   ],
   "source": [
    "epsilon_tensor = np.array([[12,5,0],[5,12,0],[0,10,12]]);\n",
    "\n",
    "## ================================================\n",
    "#diagonalize\n",
    "eps_diag, eps_eigens= np.linalg.eig(epsilon_tensor)\n",
    "print(eps_diag.shape)\n",
    "print(eps_eigens.shape) #we need to project all E fields onto this basis, specifically the Ex and Ey fields...\n",
    "##============\n",
    "\n",
    "eps_diag = np.diag(eps_diag)\n",
    "print(eps_diag)\n",
    "#here's the thing, what do we do with the rest?\n",
    "# we have to reformulate the problem because every E component gets effectively rescaled...fuck\n",
    "print(epsilon_tensor)\n",
    "epsilon_tensor = eps_diag;\n",
    "print(eps_eigens)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n",
      "(2, 2)\n"
     ]
    }
   ],
   "source": [
    "#=====================================\n",
    "\n",
    "\n",
    "ref = [];\n",
    "trans = []\n",
    "wvlen_scan = np.linspace(0.5, 4, 1000);\n",
    "thickness = 0.5; # 1 layer\n",
    "for wvlen in wvlen_scan:\n",
    "    k0 = 2*np.pi/wvlen;\n",
    "    kx = np.sin(theta)*np.cos(phi);\n",
    "    ky = np.sin(theta)*np.sin(phi);\n",
    "    \n",
    "    # we will build the system by rows?\n",
    "    a11 = -1j*(ky*mu_tensor[1,2]/mu_tensor[2,2] + kx*(epsilon_tensor[2,0]/epsilon_tensor[2,2]))\n",
    "    a12 = 1j*kx*(mu_tensor[1,2]/mu_tensor[2,2] - epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "#     a13 = kx*ky/epsilon_tensor[2,2] + mu_tensor[1,0] - mu_tensor[1,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    a13 = kx*ky/epsilon_tensor[2,2] + mu_tensor[1,0] - mu_tensor[1,2]*mu_tensor[2,0]/mu_tensor[2,2];\n",
    "#     a14 = -kx**2/epsilon_tensor[2,2] + mu_tensor[1,1]-  mu_tensor[0,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    a14 = -kx**2/epsilon_tensor[2,2] + mu_tensor[1,1]-  mu_tensor[1,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    \n",
    "    a21 = 1j* ky *(mu_tensor[0,2]/mu_tensor[2,2] - epsilon_tensor[2,0]/epsilon_tensor[2,2]);\n",
    "    a22 = -1j * kx*(mu_tensor[0,2]/mu_tensor[2,2]) +ky *(epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "    a23 = ky**2/epsilon_tensor[2,2] - mu_tensor[0,0] +  mu_tensor[0,2]*mu_tensor[2,0]/mu_tensor[2,2];\n",
    "    a24 =  -kx*ky/epsilon_tensor[2,2] - mu_tensor[0,1] + mu_tensor[0,2]*mu_tensor[2,1]/mu_tensor[2,2];\n",
    "    \n",
    "#     a31 = (kx*ky/mu_tensor[2,2] + epsilon_tensor[1,0] - epsilon_tensor[1,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2])\n",
    "    a31 = (kx*ky/mu_tensor[2,2] + epsilon_tensor[1,0] - epsilon_tensor[1,2]*epsilon_tensor[2,0]/epsilon_tensor[2,2])\n",
    "    a32 = (-kx**2/mu_tensor[2,2] +epsilon_tensor[1,1] - epsilon_tensor[1,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2]);\n",
    "#     a33 = -1j*(ky*(epsilon_tensor[1,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,0]/mu_tensor[0,0]));\n",
    "    a33 = -1j*(ky*(epsilon_tensor[1,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,0]/mu_tensor[2,2]));\n",
    "#     a34 = 1j*kx*(epsilon_tensor[1,2]/epsilon_tensor[2,2]+mu_tensor[2,1]/mu_tensor[2,2] )\n",
    "    a34 = 1j*kx*(epsilon_tensor[1,2]/epsilon_tensor[2,2]-mu_tensor[2,1]/mu_tensor[2,2] )\n",
    "    \n",
    "    a41 = ky**2/mu_tensor[2,2] - epsilon_tensor[0,0] +  epsilon_tensor[0,2]*epsilon_tensor[2,0]/epsilon_tensor[2,2];\n",
    "    a42 = -kx*ky/mu_tensor[2,2] - epsilon_tensor[0,1] + epsilon_tensor[0,2]*epsilon_tensor[2,1]/epsilon_tensor[2,2];\n",
    "#     a43 = 1j*ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2]+mu_tensor[2,0]/mu_tensor[2,2] );\n",
    "    a43 = 1j*ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2]-mu_tensor[2,0]/mu_tensor[2,2] );\n",
    "#     a44 = -1j*(ky*(epsilon_tensor[0,2]/epsilon_tensor[2,2])+kx*(mu_tensor[2,1]/mu_tensor[2,2]));\n",
    "    a44 = -1j*(kx*(epsilon_tensor[0,2]/epsilon_tensor[2,2])+ky*(mu_tensor[2,1]/mu_tensor[2,2]));\n",
    "    \n",
    "    A0 = np.matrix([[a11, a12, a13, a14],\n",
    "                  [a21, a22, a23, a24],\n",
    "                  [a31, a32, a33, a34],\n",
    "                  [a41, a42, a43, a44]]);\n",
    "    \n",
    "#     this is wrong...there are three eigenvectors from the rescaling...\n",
    "#     rescaled1 = eps_eigens[0:2, 0:2]*A0[0:2, 0:2];\n",
    "#     rescaled2 = eps_eigens[0:2, 0:2]*A0[2:, 0:2];\n",
    "    \n",
    "#     #print(rescaled2.shape)\n",
    "#     A0[0:2, 0:2] = rescaled1;\n",
    "#     A0[2:, 0:2] = rescaled2;\n",
    "#     print(A0.shape)\n",
    "#     print(A0)\n",
    "    #print(np.linalg.cond(A))\n",
    "    eigenvals, eigenmodes = np.linalg.eig(A0);\n",
    "    rounded_eigenvals = np.round(eigenvals, 3)\n",
    "\n",
    "    \n",
    "    #print(np.round(eigenvals,3)); print(np.round(eigenmodes,3))\n",
    "    \n",
    "    ## suppose we directly diagonalize this matrix.\n",
    "    \n",
    "    \n",
    "    ## we need to siphon off the forward propagating modes.\n",
    "    sorted_eigs, sorted_inds = nonHermitianEigenSorter(np.round(eigenvals,10));\n",
    "#     sorted_inds = [1,3];\n",
    "#     sorted_eigs = eigenvals[sorted_inds];\n",
    "    #print(sorted_eigs) ## since we have Ey, Ex, Hy, Hx, on a uniform slab, there is a 2-fold degeneracy \n",
    "    \n",
    "#     plt.plot(np.real(rounded_eigenvals), np.imag(rounded_eigenvals), 'o')\n",
    "#     plt.plot(np.real(sorted_eigs), np.imag(sorted_eigs), '.r')\n",
    "#     plt.show()\n",
    "    \n",
    "    ## ========================================================\n",
    "    W_i = eigenmodes[0:2, sorted_inds];\n",
    "    V_i = eigenmodes[2:, sorted_inds];\n",
    "    Om =  np.matrix(np.diag(sorted_eigs) );\n",
    "    print(Om.shape)\n",
    "    #print(np.round(W_i,3), np.round(V_i,3), np.round(Om,3))\n",
    "    \n",
    "    #then what... match boundary conditions... try using the gaylord formulation.\n",
    "    # or use the scattering matrix formalism, where we still, technically deal with all field components...\n",
    "    \n",
    "    Sg11 = np.matrix(np.zeros((2, 2))); Sg12 = np.matrix(np.eye(2, 2));\n",
    "    Sg21 = np.matrix(np.eye(2, 2)); Sg22 = np.matrix(np.zeros((2, 2)));  # matrices\n",
    "    Sg = np.block([[Sg11, Sg12], [Sg21, Sg22]]);  # initialization is equivelant as that for S_reflection side matrix\n",
    "\n",
    "    ### ================= Working on the Reflection Side =========== ##\n",
    "    Pr, Qr, kzr = pq.P_Q_kz(kx, ky, e_r, m_r)\n",
    "\n",
    "    ## ============== values to keep track of =======================##\n",
    "    S_matrices = list();\n",
    "    kz_storage = [kzr];\n",
    "    X_storage = list();\n",
    "    ## ==============================================================##\n",
    "\n",
    "    # define vacuum wavevector k0\n",
    "    lam0 = wvlen;  # k0 and lam0 are related by 2*pi/lam0 = k0\n",
    "    k0 = 2*np.pi/lam0;\n",
    "    ## modes of the layer\n",
    "    Om_r = np.matrix(cmath.sqrt(-1) * kzr * I);\n",
    "    X_storage.append(Om_r);\n",
    "    W_ref = I;\n",
    "    V_ref = Qr * Om_r.I;  # can't play games with V like with W because matrices for V are complex\n",
    "    #print(Om_r)\n",
    "    ## calculating A and B matrices for scattering matrix\n",
    "    Ar, Br = sm.A_B_matrices(Wg, W_ref, Vg, V_ref);\n",
    "\n",
    "    S_ref, Sr_dict = sm.S_R(Ar, Br);  # scatter matrix for the reflection region\n",
    "    S_matrices.append(S_ref);\n",
    "    Sg, D_r, F_r = rs.RedhefferStar(Sg, S_ref);\n",
    "\n",
    "    # longitudinal k_vector\n",
    "    ## ============ WORKING INSIDE ANISOTROPIC LAYER ================#\n",
    "    # now defIne A and B\n",
    "    A, B = sm.A_B_matrices(Wg, W_i, Vg, V_i);\n",
    "    print(A.shape)\n",
    "    # calculate scattering matrix\n",
    "    S_layer, Sl_dict = sm.S_layer(A, B, thickness, k0, Om)\n",
    "    S_matrices.append(S_layer);\n",
    "\n",
    "    ## update global scattering matrix using redheffer star\n",
    "    Sg, D_i, F_i = rs.RedhefferStar(Sg, S_layer);\n",
    "\n",
    "    ##========= Working on the Transmission Side==============##\n",
    "    Pt, Qt, kz_trans = pq.P_Q_kz(kx, ky, e_t, m_t);\n",
    "    kz_storage.append(kz_trans);\n",
    "\n",
    "    Omt = cmath.sqrt(-1) * kz_trans * I;\n",
    "    Vt = Qt * np.linalg.inv(Omt);\n",
    "\n",
    "    # get At, Bt\n",
    "    At, Bt = sm.A_B_matrices(Wg, I, Vg, Vt)\n",
    "\n",
    "    ST, ST_dict = sm.S_T(At, Bt)\n",
    "    S_matrices.append(ST);\n",
    "    # update global scattering matrix\n",
    "    Sg, D_t, F_t = rs.RedhefferStar(Sg, ST);\n",
    "\n",
    "    K_inc_vector = n_i * k0 * np.matrix([np.sin(theta) * np.cos(phi), \\\n",
    "                                         np.sin(theta) * np.sin(phi), np.cos(theta)]);\n",
    "\n",
    "    # cinc is the c1+\n",
    "    E_inc, cinc, Polarization = ic.initial_conditions(K_inc_vector, theta, normal_vector, pte, ptm)\n",
    "\n",
    "    ## COMPUTE FIELDS\n",
    "    Er = Sg[0:2, 0:2] * cinc;  # S11; #(cinc = initial mode amplitudes), cout = Sg*cinc; #2d because Ex, Ey...\n",
    "    Et = Sg[2:, 0:2] * cinc;  # S21\n",
    "\n",
    "    Er = np.squeeze(np.asarray(Er));\n",
    "    Et = np.squeeze(np.asarray(Et));\n",
    "\n",
    "    Erx = Er[0];  Ery = Er[1]; Etx = Et[0]; Ety = Et[1];\n",
    "\n",
    "    # apply the grad(E) = 0 equation to get z components, this equation comes out of the longitudinal equation \n",
    "    # or the divergence equation and is valid since the transmission region is VACUUM (as is the reflection region)\n",
    "    Erz = -(kx * Erx + ky * Ery) / kzr;\n",
    "    Etz = -(kx * Etx + ky * Ety) / kz_trans;  ## using divergence of E equation here\n",
    "\n",
    "    # add in the Erz component to vectors\n",
    "    Er = np.matrix([Erx, Ery, Erz]);  # a vector\n",
    "    Et = np.matrix([Etx, Ety, Etz]);\n",
    "\n",
    "    R = np.linalg.norm(Er) ** 2;\n",
    "    T = np.linalg.norm(Et) ** 2;\n",
    "    ref.append(R);\n",
    "    trans.append(T);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[12.  0.  0.]\n",
      " [ 0. 17.  0.]\n",
      " [ 0.  0.  7.]]\n"
     ]
    }
   ],
   "source": [
    "ref = np.array(ref);\n",
    "trans = np.array(trans)\n",
    "plt.plot(wvlen_scan, ref);\n",
    "plt.plot(wvlen_scan, trans);\n",
    "plt.plot(wvlen_scan, ref+trans)\n",
    "plt.show()\n",
    "\n",
    "print(epsilon_tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
